testing types in software engineering